package com.xy.webadmin.app.model;

import com.baomidou.mybatisplus.annotation.*;
import com.xy.webadmin.upms.model.SysDept;
import com.xy.application.common.constant.YesOrNo;
import com.xy.common.core.annotation.*;
import lombok.Data;

import java.util.Date;
import java.util.Map;

/**
 * MQTT终端配置实体对象。
 *
 * @author xiaoyue
 * @date 2025-05-13
 */
@Data
@TableName(value = "xy_mqtt_broker_config")
public class MqttBrokerConfig {

    /**
     * 主键。
     */
    @TableId(value = "id")
    private Long id;

    /**
     * 配置名称。
     */
    @TableField(value = "name")
    private String name;

    /**
     * 终端控制台地址。
     */
    @TableField(value = "broker_url")
    private String brokerUrl;

    /**
     * 客户端ID。
     */
    @TableField(value = "client_id")
    private String clientId;

    /**
     * 认证用户名。
     */
    @TableField(value = "username")
    private String username;

    /**
     * 认证密码。
     */
    @TableField(value = "password")
    private String password;

    /**
     * 是否清除会话：0保留/1清除。
     */
    @TableField(value = "clean_session")
    private Integer cleanSession;

    /**
     * 心跳间隔。
     */
    @TableField(value = "keepalive")
    private Integer keepalive;

    /**
     * 连接超时时间（秒）。
     */
    @TableField(value = "connection_timeout")
    private Integer connectionTimeout;

    /**
     * 最大未确认消息数。
     */
    @TableField(value = "max_inflight")
    private Integer maxInflight;

    /**
     * 否自动重连：0否/1是。
     */
    @TableField(value = "auto_reconnect")
    private Integer autoReconnect;

    /**
     * 是否启用TLS：0否/1是。
     */
    @TableField(value = "ssl_enabled")
    private Integer sslEnabled;

    /**
     * CA证书路径。
     */
    @TableField(value = "ca_cert_path")
    private String caCertPath;

    /**
     * 客户端证书路径。
     */
    @TableField(value = "client_cert_path")
    private String clientCertPath;

    /**
     * 客户端私钥路径。
     */
    @TableField(value = "client_key_path")
    private String clientKeyPath;

    /**
     * 私钥密码。
     */
    @TableField(value = "key_password")
    private String keyPassword;

    /**
     * 遗嘱消息主题。
     */
    @TableField(value = "will_topic")
    private String willTopic;

    /**
     * 遗嘱消息内容。
     */
    @TableField(value = "will_payload")
    private String willPayload;

    /**
     * 遗嘱消息QoS：0/1/2。
     */
    @TableField(value = "will_qos")
    private Integer willQos;

    /**
     * 遗嘱是否保留：0否/1是。
     */
    @TableField(value = "will_retain")
    private Integer willRetain;

    /**
     * MQTT协议版本（3.1/3.1.1/5.0）。
     */
    @TableField(value = "protocol_version")
    private String protocolVersion;

    /**
     * 默认QoS等级：0/1/2。
     */
    @TableField(value = "qos_level")
    private Integer qosLevel;

    /**
     * 环境标识（dev/test/prod）。
     */
    @TableField(value = "environment")
    private String environment;

    /**
     * 配置描述。
     */
    @TableField(value = "description")
    private String description;

    /**
     * 公司。
     */
    @DeptFilterColumn
    @TableField(value = "company_id")
    private Long companyId;

    /**
     * 创建时间。
     */
    @TableField(value = "create_time")
    private Date createTime;

    /**
     * 更新时间。
     */
    @TableField(value = "update_time")
    private Date updateTime;

    /**
     * 逻辑删除标记字段(0: 正常 1: 已删除)。
     */
    @TableLogic
    @TableField(value = "is_deleted")
    private Integer isDeleted;

    /**
     * 创建人。
     */
    @TableField(value = "create_user_id")
    private Long createUserId;

    /**
     * 更新者。
     */
    @TableField(value = "update_user_id")
    private Long updateUserId;

    @RelationDict(
            masterIdField = "companyId",
            slaveModelClass = SysDept.class,
            slaveIdField = "deptId",
            slaveNameField = "deptName")
    @TableField(exist = false)
    private Map<String, Object> companyIdDictMap;

    @RelationConstDict(
            masterIdField = "cleanSession",
            constantDictClass = YesOrNo.class)
    @TableField(exist = false)
    private Map<String, Object> cleanSessionDictMap;

    @RelationConstDict(
            masterIdField = "autoReconnect",
            constantDictClass = YesOrNo.class)
    @TableField(exist = false)
    private Map<String, Object> autoReconnectDictMap;

    @RelationConstDict(
            masterIdField = "sslEnabled",
            constantDictClass = YesOrNo.class)
    @TableField(exist = false)
    private Map<String, Object> sslEnabledDictMap;

    @RelationConstDict(
            masterIdField = "willRetain",
            constantDictClass = YesOrNo.class)
    @TableField(exist = false)
    private Map<String, Object> willRetainDictMap;
}
